/**
 * 导出工具模块
 * 提供卡片导出为PNG和ZIP压缩包的功能
 */
import { domToPng } from 'modern-screenshot';
import { ref } from 'vue';

// 导出设置
export const exportSettings = {
  scale: ref(4), // 导出比例，默认为4
  quality: ref(0.9) // 导出质量，默认为0.9
};

/**
 * 导出单个卡片为PNG
 * @param previewContainer 预览容器元素
 * @param exportScale 导出比例
 * @returns Promise<string> 返回数据URL
 */
export const exportSingleCardToPng = async (previewContainer: HTMLElement, exportScale = exportSettings.scale.value): Promise<string> => {
  try {
    return await domToPng(previewContainer, { scale: exportScale, quality: exportSettings.quality.value });
  } catch (error) {
    console.error('单卡片导出失败:', error);
    throw new Error('卡片导出失败');
  }
};

/**
 * 下载数据URL为文件
 * @param dataUrl 数据URL
 * @param filename 文件名
 */
export const downloadDataUrl = (dataUrl: string, filename: string): void => {
  const link = document.createElement('a');
  link.download = filename;
  link.href = dataUrl;
  link.click();
  link.remove();
};

/**
 * 导出多个卡片为ZIP压缩包
 * @param previewContainers 预览容器元素列表
 * @param exportScale 导出比例
 * @param paperSize 纸张尺寸名称
 * @returns Promise<void>
 */
export const exportMultipleCardsToZip = async (
  previewContainers: NodeListOf<HTMLElement>, 
  exportScale = exportSettings.scale.value,
  paperSize = '自定义'
): Promise<void> => {
  try {
    const { default: JSZip } = await import('jszip');
    const zip = new JSZip();
    const exportPromises = [];

    // 为每个卡片创建导出Promise
    for (let i = 0; i < previewContainers.length; i++) {
      const previewContainer = previewContainers[i];
      const promise = exportSingleCardToPng(previewContainer, exportScale)
        .then(dataUrl => {
          // 将base64数据添加到zip
          const base64Data = dataUrl.split(',')[1];
          const sizeInfo = paperSize !== '自定义' ? `_${paperSize}` : '';
          zip.file(`md2card${sizeInfo}_${i + 1}.png`, base64Data, { base64: true });
          return true;
        });
      exportPromises.push(promise);
    }

    // 等待所有导出完成
    await Promise.all(exportPromises);

    // 生成zip文件并下载
    const zipBlob = await zip.generateAsync({ type: 'blob' });
    downloadDataUrl(URL.createObjectURL(zipBlob), `md2card_${new Date().getTime()}.zip`);

    return Promise.resolve();
  } catch (error) {
    console.error('多卡片导出失败:', error);
    throw error;
  }
};

/**
 * 准备导出环境
 * 重置缩放并等待DOM更新完成
 * @param transformPreviewFn 应用变换的函数
 * @returns Promise<void>
 */
export const prepareExportEnvironment = async (transformPreviewFn: () => void): Promise<void> => {
  // 重置缩放并应用变换
  transformPreviewFn();
  
  // 等待DOM更新完成
  return new Promise(resolve => setTimeout(resolve, 1000));
};